home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / DBL Pascal Library / INIT Shell Folder / INIT Example ƒ / ChangedResPatch.p < prev    next >
Text File  |  1990-05-28  |  2KB  |  60 lines

  1. unit INITShellResident;
  2. {Copyright © 1990, David B. Lamkins}
  3. {All rights reserved.}
  4.  
  5. {This unit must be compiled as a separate project, since code resource projects cannot have}
  6. {multiple segments.  We need this to be in a separate segment from the INIT loader since we}
  7. {depend upon the presence of a the standard code header as a place to stash a handle to any}
  8. {globals we may need for the patch.  Also, it is much easier and safer to size and detach a}
  9. {separate resource for the patch code than it is to play games with address arithmetic and}
  10. {call _BlockMove to make a copy of the patch code.  By convention this code resource will}
  11. {have a type of 'IRES' (see INITShellLoader).}
  12.  
  13. interface
  14.  
  15.     uses
  16.         INITShellGlobals, INITShellInlines, Retrace, SysEqu, ResCheck;
  17.  
  18.     procedure main;
  19.  
  20. implementation
  21.  
  22. {$D-}
  23. {$V-}
  24. {$R-}
  25.  
  26. {This is the resident code.  It may have local variables.  Global data must be accessed through}
  27. {the handle obtained from the GlobalsHandle function.  See the INITShellInlines unit for further}
  28. {programming details.}
  29.     procedure main;
  30. {Patch for ChangedResource(h: Handle);}
  31.  
  32.     {Patch ChangedResource to inhibit all changes to resources which may contain a virus.}
  33.     {Note that this is not foolproof, since the application may not detect the signalled error}
  34.     {and may end up writing the changed resource anyway.}
  35.         type
  36.             IntPtr = ^INTEGER;
  37.         var
  38.             theID: INTEGER;
  39.             theType: ResType;
  40.             theName: Str255;
  41.             theSize: LONGINT;
  42.             theHandleArg: Handle;
  43.     begin
  44.         Break;        {debug stop, depending upon compile-time variable Debugging}
  45.     {First, we need to pull the handle argument to ChangedResource off the stack.}
  46.         theHandleArg := Handle(LParam(0));
  47.     {Now we find out all about the resource, so we can censor if needed.}
  48.         GetResInfo(theHandleArg, theID, theType, theName);
  49.     {Now we test the resource attributes, and perhaps its contents, looking for trouble.}
  50.         if DangerousResource(theType, theID, @theName, theHandleArg) then
  51.             begin    {we found it - fake an error and skip out w/o executing the trap}
  52.                 IntPtr(ResErr)^ := fLckdErr;
  53.                 SysBeep(5);
  54.                 DeallocateAndReturn(SIZEOF(Handle));
  55.             end
  56.         else    {no problem, continue with the trap as soon as we exit.}
  57.             SetTrapExit;
  58.     end;
  59.  
  60. end.